﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Didsoft.SalesLive.Entidades;
using System.Collections.Generic;
using Didsoft.SalesLive.Negocios;
using Didsoft.Silverlight.ViewModel.Commanding.Contracts;
using System.Linq;
using Didsoft.Silverlight.ViewModel;

namespace Didsoft.SalesLive.UI.Views.ViewModel
{
    public class VmUsuario : ViewModelBase
    {
        #region servicio negocios

        private UsuarioNegocios negocios = new UsuarioNegocios();

        #endregion

        #region propiedades bindables

        //definiendo propiedad para el combo box persona
        private IEnumerable<Persona> personas;
        public IEnumerable<Persona> Personas
        {
            get { return personas; }
            set { personas = value; Notificar("Personas"); }
        }


        //para el combobox roles
        private IEnumerable<Rol> roles;
        public IEnumerable<Rol> Roles
        {
            get { return roles; }
            set { roles = value; Notificar("Roles"); }
        }
        
        public IEnumerable<Usuario> Usuarios
        {
            get { return negocios.Usuarios; }            
        }

        private Usuario usuario;
        public Usuario Usuario
        {
            get { return usuario; }
            set { usuario = value; Notificar("Usuario");
            if (usuario != null)
                CmdEliminar.RaiseCanExecuteChanged();
            }
        }


        #endregion

        #region constructor

        public VmUsuario()
        {
            InicializarComandos();
            CargarRoles();
            CargarPersonas();
            CargarUsuarios();
        }


        #endregion

        #region metodos

        private void CargarUsuarios()
        {
            negocios.Load<Usuario>(negocios.GetUsuariosQuery(),
                                   carga =>
                                   {
                                       if (carga.HasError)
                                           carga.MarkErrorAsHandled();

                                   }, null);
        }

        private void CargarPersonas()
        {
            negocios.Load<Persona>(negocios.GetPersonasQuery(),
                                   carga =>
                                   {
                                       if (carga.HasError)
                                           carga.MarkErrorAsHandled();
                                       else
                                           Personas = carga.Entities;

                                   }, null);
        }

        private void CargarRoles()
        {
            negocios.Load<Rol>(negocios.GetRolesQuery(),
                                   carga =>
                                   {
                                       if (carga.HasError)
                                           carga.MarkErrorAsHandled();
                                       else
                                           Roles = carga.Entities;

                                   }, null);
        }

        private void InicializarComandos()
        {

            CmdNuevo = new DelegateCommand<string>(CmdNuevo_Ejecutar, CmdNuevo_PuedeEjecutar);
            CmdGuardar = new DelegateCommand<string>(CmdGuardar_Ejecutar, CmdGuardar_PuedeEjecutar);
            CmdEliminar = new DelegateCommand<string>(CmdEliminar_Ejecutar, CmdEliminar_PuedeEjecutar);


        }

        #endregion

        #region comandos

        public ICommandEvent CmdNuevo { get; set; }
        public void CmdNuevo_Ejecutar(string param)
        {
            Usuario = new Usuario();
            CmdGuardar.RaiseCanExecuteChanged();
        }
        public bool CmdNuevo_PuedeEjecutar(string param)
        {
            return true;
        }
        



        public ICommandEvent CmdGuardar { get; set; }
        public void CmdGuardar_Ejecutar(string param)
        {
            if (Usuario.Id == 0) negocios.Usuarios.Add(Usuario);
            //envia a la base de datos a guardar, pasando por la clase de negocios
            negocios.SubmitChanges();

            Usuario = null;
            CmdGuardar.RaiseCanExecuteChanged();

        }
        public bool CmdGuardar_PuedeEjecutar(string param)
        {
            return Usuario != null;
        }




        public ICommandEvent CmdEliminar { get; set; }

        public void CmdEliminar_Ejecutar(string param)
        {
            negocios.Usuarios.Remove(Usuario);
            negocios.SubmitChanges();
        }
        public bool CmdEliminar_PuedeEjecutar(string param)
        {
            return Usuario != null && negocios.Usuarios.Contains(Usuario);
        }


        #endregion

    }
}
